/*
 * Copyright (C), 2013, 上海汽车集团股份有限公司
 * FileName: DefaultTableRoute.java
 * Author:   12010065
 * Date:     2013年10月9日 下午2:03:55
 * Description: //模块目的、功能描述
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.ibm.framework.dal.route.table;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.ibm.framework.dal.constants.DalConstants;
import com.ibm.framework.dal.route.table.support.ITableRouteExt;

/**
 * 
 * 默认分表路由实现
 * 
 * @see DynamicTableRoute
 * @author 12010065
 */
@Deprecated
public class DefaultTableRoute implements TableRoute {

    /**
     * 分表参数
     */
    private static final int NUM3 = 3;

    /** <分表规则,分表策略> 映射表 */
    private Map<String, ITableRouteExt> tableMap;

    /**
     * 分表路由实现
     * 
     * @param paramMap 路由参数
     */
    @Override
    public void routeTable(Map<String, Object> paramMap) {
        if (tableMap != null && paramMap != null) {
            /** 遍历分表策略 */
            Iterator<Entry<String, ITableRouteExt>> it = tableMap.entrySet().iterator();
            while (it.hasNext()) {
                Entry<String, ITableRouteExt> entry = it.next();
                String key = entry.getKey();
                /** keys格式 = 主表名.分表字段[.分表个数] */
                String[] tabs = key.split("\\.");
                Object paramValue = parseKey(tabs, paramMap);
                if (tabs.length > 1 && paramValue != null) {
                    /** 调用分表策略 */
                    String partitionTable = entry.getValue()
                            .route((String) paramMap.get(DalConstants.ROUTE_TABLE), paramValue, getArray(tabs))
                            .toUpperCase();
                    /** 不区分大小写处理 */
                    paramMap.put(tabs[0].toLowerCase(), partitionTable);
                    paramMap.put(tabs[0].toUpperCase(), partitionTable);
                }
            }
        }
    }

    /**
     * 
     * 功能描述: <br>
     * 获取分表规则的分表个数
     * 
     * @param tabs 分表规则
     * @return 分表个数
     */
    private Integer getArray(String[] tabs) {
        /** 可选判断 */
        if (tabs.length == NUM3) {
            try {
                return Integer.parseInt(tabs[2]);
            } catch (NumberFormatException e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 
     * 功能描述: <br>
     * 解析key值，取出分表字段对应的值
     * 
     * @param tabs 分表规则
     * @param paramMap client传入参数
     * @return 分表字段对应的值
     */
    private Object parseKey(String[] tabs, Map<String, Object> paramMap) {
        Object result = null;
        /** 取分表字段的值 */
        Object routeTable = paramMap.get(DalConstants.ROUTE_TABLE);
        /** 成立条件=分表关键字不为空+规则数大于1+规则中的表名与分表关键字一致 */
        if (tabs.length > 1 && routeTable != null && tabs[0].equalsIgnoreCase((String) routeTable)) {
            result = paramMap.get(tabs[1]);
        }
        return result;
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉 获取分表策略
     * 
     * @return 分表策略
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public Map<String, ITableRouteExt> getTableMap() {
        return tableMap;
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉 设置分表策略
     * 
     * @param tableMap 分表策略
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public void setTableMap(Map<String, ITableRouteExt> tableMap) {
        this.tableMap = tableMap;
    }
}
